#include <signal.h>
#include "../ourhdr.h"

static void sig_pipe(int);

int main(void)
{
    int n, fd1[2], fd2[2];
    pid_t pid;
    char line[MAXLINE];
    if(signal(SIGPIPE, sig_pipe) == SIG_ERR)
    {
        err_sys("signal error");
    }

    if(pipe(fd1) < 0 || pipe(fd2) < 0 )
    {
        err_sys("write error to pipe");
    }

    if((pid=fork()) < 0)
    {
        err_sys("fork error");
    }
    else if(pid > 0)  /*** parent ***/
    {
        close(fd1[0]);
        close(fd2[1]);
        while(fgets(line, MAXLINE, stdin) !=NULL)
        {
            n = strlen(line);
            if(write(fd1[1],line,n)!=n)
            {
                err_sys("write error to pipe");
            }
            if((n=read(fd2[0],line,MAXLINE))<0)
            {
                err_sys("read error from pipe");
            }
            if(n==0)
            {
                err_msg("child close pipe");
            }
            line[n] = 0;
            if(fputs(line, stdout) == EOF)
            {
                err_sys("fputs  error");
            }
        }
        if(ferror(stdin))
        {
            err_sys("fgets error on stdin");
        }
        exit(0);
    }
    else            /*** child ***/
    {
        close(fd1[1]);
        close(fd2[0]);
        if(fd1[0]!= STDIN_FILENO)
        {
            if(dup2(fd1[0], STDIN_FILENO)!= STDERR_FILENO)
            {
                err_sys("dup2 error to stdin");
            }
            close(fd1[0]);
        }
        if(fd2[1]!= STDOUT_FILENO)
        {
            if(dup2(fd2[1], STDOUT_FILENO)!= STDOUT_FILENO)
            {
                err_sys("dup2 error to stdout");
            }
            close(fd2[1]);
        }
        if(execl("./add2","add2", (char*) 0)<0)
        {
            err_sys("execl error");
        }
    }
}

static void sig_pipe(int signo)
{
    printf("SIGPIPE caught\n");
    exit(1);
}
